home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
351-375
/
disk_351
/
pdc
/
libsrc.lzh
/
LibSrc
/
Math
/
frexp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-04-07
|
2KB
|
63 lines
#include <stdio.h>
#include <math.h>
#include "pml.h"
/*
* Frexp returns the significand of a double "value" as a double quanity,
* "x", of magnitude less than 1 and stores an integer "n", indirectly
* through "eptr", such that "value" = "x" * 2^"n"
*
* For the mc68000 using IEEE format the double precision word format is:
*
* WORD N => SEEEEEEEEEEEMMMM
* WORD N+1 => MMMMMMMMMMMMMMMM
* WORD N+2 => MMMMMMMMMMMMMMMM
* WORD N+3 => MMMMMMMMMMMMMMMM
*
* Where: S => Sign bit
* E => Exponent
* X => Ignored (set to 0)
* M => Mantissa bit
*
* NOTE: Beware of 0.0; on some machines which use excess 128 notation for the
* exponent, if the mantissa is zero the exponent is also.
*
*/
#define MANT_MASK 0x800FFFFF /* Mantissa extraction mask */
#define ZPOS_MASK 0x3FF00000 /* Positive # mask for exp = 0 */
#define ZNEG_MASK 0x3FF00000 /* Negative # mask for exp = 0 */
#define EXP_MASK 0x7FF00000 /* Mask for exponent */
#define EXP_SHIFTS 20 /* Shifts to get into LSB's */
#define EXP_BIAS 1022 /* Exponent bias */
union dtol {
double dval;
int ival[2];
};
double
frexp(value, eptr)
double value;
int *eptr;
{
union dtol number;
int *iptr, cexp, exp;
if (value == 0.0) {
*eptr = 0;
return (0.0);
}
else {
number.dval = value;
iptr = &number.ival[0];
*eptr = (((*iptr) & EXP_MASK) >> EXP_SHIFTS) - EXP_BIAS;
*iptr &= ~EXP_MASK;
exp = EXP_BIAS;
*iptr |= (exp << EXP_SHIFTS) & EXP_MASK;
return (number.dval);
}
}